<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.8">
<title>Neo4j ETL</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
/* Uncomment @import statement below to use as custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
audio,canvas,video{display:inline-block}
audio:not([controls]){display:none;height:0}
script{display:none!important}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:transparent}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.stretch{width:100%}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:none}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite::before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
.clearfix::after,.float-group::after{clear:both}
*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
*:not(pre)>code.nobreak{word-wrap:normal}
*:not(pre)>code.nowrap{white-space:nowrap}
pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menuref{color:#000}
.menuseq b:not(.caret),.menuref{font-weight:inherit}
.menuseq{word-spacing:-.02em}
.menuseq b.caret{font-size:1.25em;line-height:.8}
.menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
b.button::before{content:"[";padding:0 3px 0 2px}
b.button::after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
#header::after,#content::after,#footnotes::after,#footer::after{clear:both}
#content{margin-top:1.25em}
#content::before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
#header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span::before{content:"\00a0\2013\00a0"}
#header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark::before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber::after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
@media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
#content{margin-bottom:.625em}
.sect1{padding-bottom:.625em}
@media screen and (min-width:768px){#content{margin-bottom:1.25em}
.sect1{padding-bottom:1.25em}}
.sect1:last-child{padding-bottom:0}
.sect1+.sect1{border-top:1px solid #e7e7e9}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor::before,h2>a.anchor::before,h3>a.anchor::before,#toctitle>a.anchor::before,.sidebarblock>.content>.title>a.anchor::before,h4>a.anchor::before,h5>a.anchor::before,h6>a.anchor::before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
.paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
@media screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
@media screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
.literalblock pre.nowrap,.literalblock pre.nowrap pre,.listingblock pre.nowrap,.listingblock pre.nowrap pre{white-space:pre;word-wrap:normal}
.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.listingblock>.content{position:relative}
.listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
.listingblock:hover code[data-lang]::before{display:block}
.listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:#999}
.listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
table.pyhltable td.code{padding-left:.75em;padding-right:0}
pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #dddddf}
pre.pygments .lineno{display:inline-block;margin-right:.25em}
table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
.verseblock{margin:0 1em 1.25em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
.quoteblock.abstract blockquote,.quoteblock.abstract p,.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{line-height:1.6;word-spacing:0}
.quoteblock.abstract{margin:0 1em 1.25em;display:block}
.quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
.quoteblock.excerpt,.quoteblock .quoteblock{margin:0 0 1.25em;padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
.quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
.quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
table.tableblock{max-width:100%;border-collapse:separate}
p.tableblock:last-child{margin-bottom:0}
td.tableblock>.content{margin-bottom:-1.25em}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
table.grid-all>tbody>tr:last-child>.tableblock,table.grid-all>thead:last-child>tr>.tableblock,table.grid-rows>tbody>tr:last-child>.tableblock,table.grid-rows>thead:last-child>tr>.tableblock{border-bottom-width:0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot,table.frame-ends{border-width:1px 0}
table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd){background:#f8f8f7}
table.stripes-none tr,table.stripes-odd tr:nth-of-type(even){background:none}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
td>div.verse{white-space:pre}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
ul.unstyled,ol.unstyled{margin-left:0}
ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1.25em;font-size:.8em;position:relative;bottom:.125em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
ul.inline{display:-ms-flexbox;display:-webkit-box;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap;list-style:none;margin:0 0 .625em -1.25em}
ul.inline>li{margin-left:1.25em}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
.colist td:not([class]):first-child img{max-width:none}
.colist td:not([class]):last-child{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left{margin:.25em .625em 1.25em 0}
.imageblock.right{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background-color:#00fafa}
.black{color:#000}
.black-background{background-color:#000}
.blue{color:#0000bf}
.blue-background{background-color:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background-color:#fa00fa}
.gray{color:#606060}
.gray-background{background-color:#7d7d7d}
.green{color:#006000}
.green-background{background-color:#007d00}
.lime{color:#00bf00}
.lime-background{background-color:#00fa00}
.maroon{color:#600000}
.maroon-background{background-color:#7d0000}
.navy{color:#000060}
.navy-background{background-color:#00007d}
.olive{color:#606000}
.olive-background{background-color:#7d7d00}
.purple{color:#600060}
.purple-background{background-color:#7d007d}
.red{color:#bf0000}
.red-background{background-color:#fa0000}
.silver{color:#909090}
.silver-background{background-color:#bcbcbc}
.teal{color:#006060}
.teal-background{background-color:#007d7d}
.white{color:#bfbfbf}
.white-background{background-color:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background-color:#fafa00}
span.icon>.fa{cursor:default}
a span.icon>.fa{cursor:inherit}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]::after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@page{margin:1.25cm .75cm}
@media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
html{font-size:80%}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]::after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span::before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]::before{display:block}
#footer{padding:0 .9375em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
@media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
.sect1{padding:0!important}
.sect1+.sect1{border:0}
#footer{background:none}
#footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
@media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
</style>
</head>
<body class="article">
<div id="header">
<h1>Neo4j ETL</h1>
</div>
<div id="content">
<div class="sect1">
<h2 id="_overview">Overview</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_features">Features</h3>
<div class="ulist">
<ul>
<li>
<p>Neo4j-ETL UI in Neo4j Desktop</p>
</li>
<li>
<p>Manage multiple RDBMS connections</p>
</li>
<li>
<p>automatically extract database metadata from relational database</p>
</li>
<li>
<p>derive graph model</p>
</li>
<li>
<p>visually edit labels, relationship-types, property-names and types</p>
</li>
<li>
<p>visualize current model as a graph</p>
</li>
<li>
<p>persist mapping as json</p>
</li>
<li>
<p>retrieve relevant CSV data from relational databases</p>
</li>
<li>
<p>run import via neo4j-import, bolt-connector, cypher-shell, neo4j-shell</p>
</li>
<li>
<p>bundles MySQL, PostgreSQL, allows custom JDBC driver with Neo4j Enterprise</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_license">License</h3>
<div class="paragraph">
<p>This tool is licensed under the <a href="LICENSE.txt">NEO4J PRE-RELEASE LICENSE AGREEMENT</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_issues_feedback_contributions">Issues &amp; Feedback &amp; Contributions</h3>
<div class="ulist">
<ul>
<li>
<p>You can raise <a href="issues">GitHub issues</a> or send feedback to <a href="mailto:feedback@neo4j.com">feedback@neo4j.com</a></p>
</li>
<li>
<p>Please also join our <a href="https://community.neo4j.com/c/neo4j-graph-platform/etl">Community Site</a> ask in the appropriate category</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_download_run_command_line_tool">Download &amp; Run Command Line Tool</h3>
<div class="paragraph">
<p>Download &amp; unzip the latest <a href="https://github.com/neo4j-contrib/neo4j-etl/releases/latest" target="_blank" rel="noopener">neo4j-etl.zip</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_examples_of_command_usage">Examples of command usage:</h3>
<div class="listingblock">
<div class="title">Minimal command line</div>
<div class="content">
<pre>./bin/neo4j-etl export \
 --rdbms:url &lt;url&gt; --rdbms:user &lt;user&gt; --rdbms:password &lt;password&gt; \
 --destination $NEO4J_HOME/data/databases/graph.db/ --import-tool $NEO4J_HOME/bin \
 --csv-directory $NEO4J_HOME/import</pre>
</div>
</div>
<div class="listingblock">
<div class="title">Full set of command line options</div>
<div class="content">
<pre>./bin/neo4j-etl export \
 --rdbms:url &lt;url&gt; --rdbms:user &lt;user&gt; --rdbms:password &lt;password&gt; --rdbms:schema &lt;schema&gt; \
 --using { bulk:neo4j-import | cypher:neo4j-shell | cypher:shell | cypher:direct | cypher:batch | cypher:fromSQL } \
 --neo4j:url &lt;neo4j url&gt; --neo4j:user &lt;neo4j user&gt; --neo4j:password &lt;neo4j password&gt; \
 --destination $NEO4J_HOME/data/databases/graph.db/ --import-tool $NEO4J_HOME/bin \
 --csv-directory $NEO4J_HOME/import --options-file import-tool-options.json --force --debug</pre>
</div>
</div>
<div class="listingblock">
<div class="title">Additional command line options for <code>cypher:batch</code> and <code>cypher:fromSQL</code> import modes:</div>
<div class="content">
<pre> --unwind-batch-size &lt;value&gt; (Batch size that will be used for unwind data) \
 --tx-batch-size &lt;value&gt; (Transaction Batch size that will be used for unwind commit) \</pre>
</div>
</div>
<div class="paragraph">
<p>For detailed usage see also the: <a href="http://neo4j-contrib.github.io/neo4j-etl#neo4j-etl-cli">tool documentation</a>.</p>
</div>
</div>
<div class="sect2">
<h3 id="_neo4j_desktop">Neo4j-Desktop</h3>
<div class="paragraph">
<p>Use the Application URL <code><a href="https://r.neo4j.com/neo4j-etl-app" class="bare">https://r.neo4j.com/neo4j-etl-app</a></code> in the "Graph Apps" tab of Neo4j Desktop.</p>
</div>
<div class="paragraph">
<p><span class="image"><img src="img/neo4j-etl-install.jpg" alt="neo4j etl install" width="400"></span>
<span class="image"><img src="img/graph-app-icon.jpg" alt="graph app icon" width="400"></span></p>
</div>
<div class="paragraph">
<p>Then the next time you start Neo4j Desktop you&#8217;ll see Neo4j ETL as a UI to be used interactively.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
<col style="width: 25%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-center valign-middle">Configure Driver</th>
<th class="tableblock halign-center valign-middle">Load Mapping</th>
<th class="tableblock halign-center valign-middle">Edit Mapping</th>
<th class="tableblock halign-center valign-middle">Import Data</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-center valign-middle"><p class="tableblock"><span class="image"><img src="img/driver.jpg" alt="driver" width="200"></span></p></td>
<td class="tableblock halign-center valign-middle"><p class="tableblock"><span class="image"><img src="img/load-mapping.jpg" alt="load mapping" width="200"></span></p></td>
<td class="tableblock halign-center valign-middle"><p class="tableblock"><span class="image"><img src="img/edit-mapping.jpg" alt="edit mapping" width="200"></span></p></td>
<td class="tableblock halign-center valign-middle"><p class="tableblock"><span class="image"><img src="img/import-data.jpg" alt="import data" width="200"></span></p></td>
</tr>
</tbody>
</table>
<div class="paragraph">
<p>We put <a href="https://neo4j.com/developer/neo4j-etl">detailed usage instructions for the Neo4j ETL Tool</a> in the Neo4j Developer Pages.</p>
</div>
</div>
<div class="sect2">
<h3 id="_jdbc_drivers">JDBC Drivers</h3>
<div class="paragraph">
<p>The drivers for MySQL and PostgreSQL are bundled with the Neo4j-ETL tool.</p>
</div>
<div class="paragraph">
<p>To use other JDBC drivers use these download links and JDBC URLs.
Provide the JDBC driver jar-file to the command line tool or Neo4j-ETL application.
And use the JDBC-URL with the <code>--rdbms:url</code> parameter or in the JDBC-URL input field.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 20%;">
<col style="width: 60%;">
<col style="width: 20%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Database</th>
<th class="tableblock halign-left valign-top">JDBC-URL</th>
<th class="tableblock halign-left valign-top"> Driver Source</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Oracle</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:oracle:thin:&lt;user&gt;/&lt;pass&gt;@&lt;host&gt;:&lt;port&gt;/&lt;service_name&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="http://www.oracle.com/technetwork/database/features/jdbc/index.html" target="_blank" rel="noopener">Oracle JDBC Driver</a></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>MS SQLServer</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:sqlserver://;servername=&lt;servername&gt;;databaseName=&lt;database&gt;;user=&lt;user&gt;;password=&lt;pass&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="https://www.microsoft.com/en-us/download/details.aspx?id=11774" target="_blank" rel="noopener">SQLServer Driver</a></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>IBM DB2</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:db2://&lt;host&gt;:&lt;port/5021&gt;/&lt;database&gt;:user=&lt;user&gt;;password=&lt;pass&gt;;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="http://www-01.ibm.com/support/docview.wss?uid=swg21363866" target="_blank" rel="noopener">DB2 Driver</a></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Derby</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:derby:derbyDB</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Included since JDK6</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Cassandra</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:cassandra://&lt;host&gt;:&lt;port/9042&gt;/&lt;database&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="https://github.com/adejanovski/cassandra-jdbc-wrapper#installing" target="_blank" rel="noopener">Cassandra JDBC Wrapper</a></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>SAP Hana</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:sap://&lt;host&gt;:&lt;port/39015&gt;/?user=&lt;user&gt;&amp;password=&lt;pass&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="https://www.sap.com/developer/tutorials/hxe-connect-hxe-using-jdbc.html" target="_blank" rel="noopener">SAP Hana ngdbc Driver</a></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>MySQL</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:mysql://&lt;hostname&gt;:&lt;port/3306&gt;/&lt;database&gt;?user=&lt;user&gt;&amp;password=&lt;pass&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="http://dev.mysql.com/downloads/connector/j/" target="_blank" rel="noopener">MySQL Driver</a></p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>PostgreSQL</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>jdbc:postgresql://&lt;hostname&gt;/&lt;database&gt;?user=&lt;user&gt;&amp;password=&lt;pass&gt;</code></p></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="https://jdbc.postgresql.org/download.html" target="_blank" rel="noopener">PostgreSQL JDBC Driver</a></p>
</div></div></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_introduction">Introduction</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Neo4j ETL, especially the <code>neo4j-etl</code> command-line tool, can be used to import well modeled (i.e. normalized) relational data into Neo4j.
It applies some simple rules for transforming the relational model.</p>
</div>
<div class="paragraph">
<p>The process as outlined below:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p>Read database metadata and generate mapping.json</p>
</li>
<li>
<p>Optionally edit mapping.json with the <code>neo4j-etl-ui</code> in Neo4j Desktop</p>
</li>
<li>
<p>Export relational data to CSV</p>
</li>
<li>
<p>Generate Mapping Headers</p>
</li>
<li>
<p>Import into Neo4j using</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>the <code>neo4j-import</code> tool for initial <strong>offline</strong> bulk load</p>
</li>
<li>
<p>the <code>neo4j-shell</code> tool for incremental <strong>offline</strong> bulk load</p>
</li>
<li>
<p>the <code>cypher-shell</code> tool for incremental <strong>online</strong> single-transaction load</p>
</li>
<li>
<p>the <code>java bolt driver</code> for incremental <strong>online</strong> batch load</p>
</li>
</ol>
</div>
</li>
</ol>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_architecture_diagram">Architecture Diagram</h2>
<div class="sectionbody">
<div class="imageblock">
<div class="content">
<img src="neo4j-etl-architecture.png" alt="neo4j etl architecture">
</div>
</div>
<div class="sect2">
<h3 id="_what_it_is">What it is</h3>
<div class="ulist">
<ul>
<li>
<p>Command-Line tools</p>
</li>
<li>
<p>Java API/library</p>
</li>
<li>
<p>Infer Schema and save in mapping file</p>
</li>
<li>
<p>Filter and merge strategies</p>
</li>
<li>
<p>Read mapping file to export data from other databases then</p>
</li>
<li>
<p>Import into Neo via different tools (<code>neo4j-import</code>, <code>neo4j-shell</code>, <code>cypher-shell</code>, <code>java bolt driver</code>)</p>
</li>
<li>
<p>Work in offline and online mode</p>
</li>
<li>
<p>Import in both an empty (initial load) and not-empty graph (incremental)</p>
</li>
<li>
<p>Build indexes and constraints</p>
</li>
<li>
<p>Support on Unix-like and Microsoft Operating Systems</p>
</li>
<li>
<p>Support for most popular relational databases like MySQL, PostgreSQL, Oracle and Microsoft SQL</p>
</li>
<li>
<p>Support user specified JDBC drivers</p>
</li>
<li>
<p>UI tool to visually modify mappings</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_plans_for_the_future">Plans for the Future</h3>
<div class="ulist">
<ul>
<li>
<p>Custom Mapping Rules + Transformations for names, data, links</p>
</li>
<li>
<p>Exemplary integration into a 3rd party ETL pipeline</p>
</li>
<li>
<p>More data types (binary, datetime, geo)</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_who_is_it_for">Who is it for</h3>
<div class="ulist">
<ul>
<li>
<p>Developer learning to work with Neo4j for initial data import</p>
</li>
<li>
<p>Partners providing data integration with Neo4j</p>
</li>
<li>
<p>Enterprise developers building applications based on well modeled relational data</p>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_open_questions">Open Questions</h3>
<div class="ulist">
<ul>
<li>
<p>Date and binary datatypes</p>
</li>
<li>
<p>Security (secure connections, handling of passwords, encrypting data)</p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="neo4j-etl-cli">neo4j-etl Command Line Tool</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This is the command-line tool you use to retrieve and map the metadata from your relational database and drive the export from the relational and import into Neo4j database.</p>
</div>
<div class="paragraph">
<p>With the graphical user interface you can preview the resulting graph data model and eventually adapt it by changing labels, property names, relationship-types and property types.</p>
</div>
<div class="paragraph">
<p>It supports all relational databases with a JDBC driver, like <strong>MySQL</strong>, <strong>PostgreSQL</strong>, <strong>Oracle</strong> and <strong>Microsoft SQL</strong>.</p>
</div>
<div class="paragraph">
<p>You can get the <a href="http://github.com/neo4j-contrib/neo4j-etl/releases/latest">latest version of the import tool from GitHub</a>.</p>
</div>
<div class="paragraph">
<p>Once downloaded and uncompressed the operating system specific <code>zip</code> / <code>tar.gz</code>, you also need download the proper JDBC Driver and add it to the <code>lib</code> folder.</p>
</div>
<div class="paragraph">
<p>You can follow the proper link in the below table in order to download the proper driver jar</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 50%;">
<col style="width: 50%;">
</colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Vendor</th>
<th class="tableblock halign-left valign-top">JDBC Driver URL</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://www.mysql.com/">MySql</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="http://dev.mysql.com/downloads/connector/j/" class="bare">http://dev.mysql.com/downloads/connector/j/</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="http://www.postgresql.com/">PostgreSql</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://jdbc.postgresql.org/download.html" class="bare">https://jdbc.postgresql.org/download.html</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://www.oracle.com/">Oracle</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="http://www.oracle.com/technetwork/database/features/jdbc/default-2280470.html" class="bare">http://www.oracle.com/technetwork/database/features/jdbc/default-2280470.html</a></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://www.microsoft.com/en-us/sql-server/">Microsoft SQL Server</a></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://www.microsoft.com/en-us/download/details.aspx?id=55539" class="bare">https://www.microsoft.com/en-us/download/details.aspx?id=55539</a></p></td>
</tr>
</tbody>
</table>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
For very large databases make sure to have enough disk-space for the CSV export and the Neo4j datastore and enough RAM and CPUs to finish the import quickly.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="_available_commands">Available commands</h3>

</div>
<div class="sect2">
<h3 id="_generate_metadata_mapping_command">'generate-metadata-mapping' command</h3>
<div class="listingblock">
<div class="content">
<pre>NAME
        neo4j-etl generate-metadata-mapping - Create RDBMS to Neo4j metadata
        mapping Json.

SYNOPSIS
        neo4j-etl generate-metadata-mapping
                [ {--columns | --cols} &lt;Columns&gt;... ]
                [ --config-file &lt;Configuration File&gt; ]
                [ {-d | --database} &lt;RDBMS database&gt; ] [ --debug ]
                [ --delimiter &lt;delimiter&gt; ] [ {--driver | --jars} &lt;--driver &lt;PATH_TO_YOUR_JAR1&gt; --driver &lt;PATH_TO_YOUR_JAR2&gt;&gt;... ]
                [ {--exclusion-mode | --exc} &lt;Tables: exclude|include|none(default)&gt; ]
                [ {--exclusion-mode-column-type | --exctype} &lt;exclude|include|none(default)&gt; ]
                [ {--exclusion-mode-columns | --excc} &lt;exclude|include|none(default)&gt; ]
                [ {--exclusion-mode-tables | --exct} &lt;exclude|include|none(default)&gt; ]
                [ --options-file &lt;option file&gt; ] [ --output-mapping-file &lt;file|stdout&gt; ]
                [ {-p | --port} &lt;RDBMS port&gt; ] [ --quote &lt;quote&gt; ]
                [ {--rdbms:fetch-size | --fs} &lt;fetch-size&gt; ]
                [ {--rdbms:password | --password} &lt;RDBMS password&gt; ]
                [ {--rdbms:schema | -s | --schema} &lt;schema&gt; ]
                [ {--rdbms:url | --url} &lt;RDBMS url&gt; ]
                [ {--rdbms:user | -u | --user} &lt;RDBMS user&gt; ]
                [ {--relationship-name | --rel-name} &lt;table(default)|column&gt; ]
                [ --schemas &lt;Schemas&gt;... ] [ {--tables | --tabs} &lt;Tables&gt;... ]
                [ --tiny-int &lt;byte(default)|boolean&gt; ] [ --types &lt;Types&gt;... ] [--] [ &lt;table1 table2 ...&gt;... ]

OPTIONS
        --columns &lt;Columns&gt;, --cols &lt;Columns&gt;
            Lists all columns to include/exclude by name or pattern
            Use '-r' &lt;PATTERN&gt; to filter by regex, ex. '-r .*\.orders\..*_id' or
            'northwind\.orders\..*_id' ,
            '-g' &lt;PATTERN&gt; for grep syntax, ex. '-g .*\.orders\..*_id' or
            'northwind\.orders\..*_id' ,
            or '-l' &lt;LIST&gt; to list all columns names ex. '-l
            northwind.customers.id,northwind.purchase.id,northwind.orders.id'

        --config-file &lt;Configuration File&gt;
            Specify the path to a file containing the configuration for the
            selected command

        -d &lt;RDBMS database&gt;, --database &lt;RDBMS database&gt;
            RDBMS database.

            This option is required if any of the following options are
            specified: host


        --debug
            Print detailed diagnostic output.

        --delimiter &lt;delimiter&gt;
            Delimiter to separate fields in CSV.

        --driver &lt;--driver &lt;PATH_TO_YOUR_JAR1&gt; --driver &lt;PATH_TO_YOUR_JAR2&gt;&gt;, --jars &lt;--driver &lt;PATH_TO_YOUR_JAR1&gt; --driver &lt;PATH_TO_YOUR_JAR2&gt;&gt;
            List of additional drivers as a list

        --exclusion-mode &lt;Tables: exclude|include|none(default)&gt;, --exc &lt;Tables: exclude|include|none(default)&gt;
            Specifies how to handle table exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified tables from the process. All other
            tables will be included.
            include: Includes specified tables only. All other tables will be
            excluded.
            none: All tables are included in the process.

        --exclusion-mode-column-type &lt;exclude|include|none(default)&gt;, --exctype
        &lt;exclude|include|none(default)&gt;
            Specifies how to handle column type exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified columns types from the process. All
            other columns types will be included.
            include: Includes specified columns types only. All other columns
            types will be excluded.
            none: All columns types are included in the process.

        --exclusion-mode-columns &lt;exclude|include|none(default)&gt;, --excc
        &lt;exclude|include|none(default)&gt;
            Specifies how to handle column exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified columns from the process. All other
            columns will be included.
            include: Includes specified columns only. All other columns will be
            excluded.
            none: All columns are included in the process.

        --exclusion-mode-tables &lt;exclude|include|none(default)&gt;, --exct
        &lt;exclude|include|none(default)&gt;
            Specifies how to handle table exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified tables from the process. All other
            tables will be included.
            include: Includes specified tables only. All other tables will be
            excluded.
            none: All tables are included in the process.

        --options-file &lt;option file&gt;
            Path to file containing Neo4j import tool options.

        --output-mapping-file &lt;file|stdout&gt;
            Path to the output metadata mapping file.

        -p &lt;RDBMS port&gt;, --port &lt;RDBMS port&gt;
            Port number to use for connection to RDBMS.

        --quote &lt;quote&gt;
            Character to treat as quotation character for values in CSV data.

        --rdbms:fetch-size &lt;fetch-size&gt;, --fs &lt;fetch-size&gt;
            RDBMS Fetch size

        --rdbms:password &lt;RDBMS password&gt;, --password &lt;RDBMS password&gt;
            Password for login to RDBMS.

            This option is required if any of the following options are
            specified: --rdbms:url, --url


        --rdbms:schema &lt;schema&gt;, -s &lt;schema&gt;, --schema &lt;schema&gt;
            RDBMS schema.

        --rdbms:url &lt;RDBMS url&gt;, --url &lt;RDBMS url&gt;
            Url to use for connection to RDBMS.

        --rdbms:user &lt;RDBMS user&gt;, -u &lt;RDBMS user&gt;, --user &lt;RDBMS user&gt;
            User for login to RDBMS.

            This option is required if any of the following options are
            specified: --rdbms:url, --url


        --relationship-name &lt;table(default)|column&gt;, --rel-name
        &lt;table(default)|column&gt;
            Specifies whether to get the name for relationships from table names
            or column names.

        --schemas &lt;Schemas&gt;
            Lists all schemas to include by name or pattern.
            Use '-r' &lt;PATTERN&gt; to filter by regex, ex. '-r .*\.north.*',
            '-g' &lt;PATTERN&gt; for grep syntax, ex. '-g .*\.north.*' ,
            or '-l' &lt;LIST&gt; to list all schemas names ex. '-l northwind,exc'

        --tables &lt;Tables&gt;, --tabs &lt;Tables&gt;
            Lists all tables to include/exclude by name or pattern.
            Use '-r' &lt;PATTERN&gt; to filter by regex, ex. '-r .*\.purchase.*' or
            'northwind.purchase.*' ,
            '-g' &lt;PATTERN&gt; for grep syntax, ex. '-g .*\.purchase.*' or
            'northwind.purchase.*' ,
            or '-l' &lt;LIST&gt; to list all tables names ex. '-l
            customers,purchase,orders'

        --tiny-int &lt;byte(default)|boolean&gt;
            Specifies whether to convert TinyInt to byte or boolean

        --types &lt;Types&gt;
            Lists all column types to include/exclude by name separated by
            commas. Valid values:
            unknown,
            binary,
            bit,
            character,
            id,
            integer,
            real,
            reference,
            temporal,
            url,
            xml,
            large_object,
            object;

        --
            This option can be used to separate command-line options from the
            list of arguments (useful when arguments might be mistaken for
            command-line options)

        &lt;table1 table2 ...&gt;
            Tables to be excluded/included</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_export_command">'export' command</h3>
<div class="listingblock">
<div class="content">
<pre>NAME
        neo4j-etl export - Export from RDBMS and import into NEO4J via CSV
        files.

SYNOPSIS
        neo4j-etl export [ {--columns | --cols} &lt;Columns&gt;... ]
                [ --config-file &lt;Configuration File&gt; ]
                [ --csv-directory &lt;csv directory&gt; ]
                [ {-d | --database} &lt;RDBMS database&gt; ] [ --debug ]
                [ --delimiter &lt;delimiter&gt; ] [ --destination &lt;directory&gt; ] [ {--driver | --jars} &lt;--driver &lt;PATH_TO_YOUR_JAR1&gt; --driver &lt;PATH_TO_YOUR_JAR2&gt;&gt;... ]
                [ {--exclusion-mode | --exc} &lt;Tables: exclude|include|none(default)&gt; ]
                [ {--exclusion-mode-column-type | --exctype} &lt;exclude|include|none(default)&gt; ]
                [ {--exclusion-mode-columns | --excc} &lt;exclude|include|none(default)&gt; ]
                [ {--exclusion-mode-tables | --exct} &lt;exclude|include|none(default)&gt; ]
                [ --force ] [ --import-tool &lt;import tool path&gt; ]
                [ --mapping-file &lt;file|stdin&gt; ] [ {--neo4j:password | --graph:password | --graph:neo4j:password} &lt;neo4j password&gt; ]
                [ {--neo4j:url | --graph:url | --graph:neo4j:url} &lt;neo4j url&gt; ]
                [ {--neo4j:user | --graph:user | --graph:neo4j:user} &lt;neo4j user&gt; ]
                [ --options-file &lt;option file&gt; ] [ --output-mapping-file &lt;file|stdout&gt; ]
                [ {-p | --port} &lt;RDBMS port&gt; ] [ --quote &lt;quote&gt; ]
                [ {--rdbms:fetch-size | --fs} &lt;fetch-size&gt; ]
                [ {--rdbms:password | --password} &lt;RDBMS password&gt; ]
                [ {--rdbms:schema | -s | --schema} &lt;schema&gt; ]
                [ {--rdbms:url | --url} &lt;RDBMS url&gt; ]
                [ {--rdbms:user | -u | --user} &lt;RDBMS user&gt; ]
                [ {--relationship-name | --rel-name} &lt;table(default)|column&gt; ]
                [ --schemas &lt;Schemas&gt;... ] [ {--tables | --tabs} &lt;Tables&gt;... ]
                [ --tiny-int &lt;byte(default)|boolean&gt; ] [ --types &lt;Types&gt;... ]
                [ --using &lt;import tool&gt; ] [--] [ &lt;table1 table2 ...&gt;... ]

OPTIONS
        --columns &lt;Columns&gt;, --cols &lt;Columns&gt;
            Lists all columns to include/exclude by name or pattern
            Use '-r' &lt;PATTERN&gt; to filter by regex, ex. '-r .*\.orders\..*_id' or
            'northwind\.orders\..*_id' ,
            '-g' &lt;PATTERN&gt; for grep syntax, ex. '-g .*\.orders\..*_id' or
            'northwind\.orders\..*_id' ,
            or '-l' &lt;LIST&gt; to list all columns names ex. '-l
            northwind.customers.id,northwind.purchase.id,northwind.orders.id'

        --config-file &lt;Configuration File&gt;
            Specify the path to a file containing the configuration for the
            selected command

        --csv-directory &lt;csv directory&gt;
            Path to directory for intermediate CSV files.

        -d &lt;RDBMS database&gt;, --database &lt;RDBMS database&gt;
            RDBMS database.

            This option is required if any of the following options are
            specified: host


        --debug
            Print detailed diagnostic output.

        --delimiter &lt;delimiter&gt;
            Delimiter to separate fields in CSV.

        --destination &lt;directory&gt;
            Path to destination store directory.

        --driver &lt;--driver &lt;PATH_TO_YOUR_JAR1&gt; --driver &lt;PATH_TO_YOUR_JAR2&gt;&gt;, --jars &lt;--driver &lt;PATH_TO_YOUR_JAR1&gt; --driver &lt;PATH_TO_YOUR_JAR2&gt;&gt;
            List of additional drivers as a list

        --exclusion-mode &lt;Tables: exclude|include|none(default)&gt;, --exc &lt;Tables: exclude|include|none(default)&gt;
            Specifies how to handle table exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified tables from the process. All other
            tables will be included.
            include: Includes specified tables only. All other tables will be
            excluded.
            none: All tables are included in the process.

        --exclusion-mode-column-type &lt;exclude|include|none(default)&gt;, --exctype
        &lt;exclude|include|none(default)&gt;
            Specifies how to handle column type exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified columns types from the process. All
            other columns types will be included.
            include: Includes specified columns types only. All other columns
            types will be excluded.
            none: All columns types are included in the process.

        --exclusion-mode-columns &lt;exclude|include|none(default)&gt;, --excc
        &lt;exclude|include|none(default)&gt;
            Specifies how to handle column exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified columns from the process. All other
            columns will be included.
            include: Includes specified columns only. All other columns will be
            excluded.
            none: All columns are included in the process.

        --exclusion-mode-tables &lt;exclude|include|none(default)&gt;, --exct
        &lt;exclude|include|none(default)&gt;
            Specifies how to handle table exclusion. Options are mutually
            exclusive.
            exclude: Excludes specified tables from the process. All other
            tables will be included.
            include: Includes specified tables only. All other tables will be
            excluded.
            none: All tables are included in the process.

        --force
            Force delete destination store directory if it already exists.

        --import-tool &lt;import tool path&gt;
            Path to directory containing Neo4j import tool. Mandatory only for Offline Bulk Import mode

        --mapping-file &lt;file|stdin&gt;
            Path to an existing metadata mapping file. The name 'stdin' will
            cause the CSV resources definitions to be read from standard input.

        --neo4j:password &lt;neo4j password&gt;, --graph:password &lt;neo4j password&gt;,
        --graph:neo4j:password &lt;neo4j password&gt;
            Password for login to Neo4j.

        --neo4j:url &lt;neo4j url&gt;, --graph:url &lt;neo4j url&gt;, --graph:neo4j:url
        &lt;neo4j url&gt;
            Url to use for connection to Neo4j.

        --neo4j:user &lt;neo4j user&gt;, --graph:user &lt;neo4j user&gt;, --graph:neo4j:user
        &lt;neo4j user&gt;
            User for login to Neo4j.

        --options-file &lt;option file&gt;
            Path to file containing Neo4j import tool options.

        --output-mapping-file &lt;file|stdout&gt;
            Path to the output metadata mapping file.

        -p &lt;RDBMS port&gt;, --port &lt;RDBMS port&gt;
            Port number to use for connection to RDBMS.

        --quote &lt;quote&gt;
            Character to treat as quotation character for values in CSV data.

        --rdbms:fetch-size &lt;fetch-size&gt;, --fs &lt;fetch-size&gt;
            RDBMS Fetch size

        --rdbms:password &lt;RDBMS password&gt;, --password &lt;RDBMS password&gt;
            Password for login to RDBMS.

            This option is required if any of the following options are
            specified: --rdbms:url, --url


        --rdbms:schema &lt;schema&gt;, -s &lt;schema&gt;, --schema &lt;schema&gt;
            RDBMS schema.

        --rdbms:url &lt;RDBMS url&gt;, --url &lt;RDBMS url&gt;
            Url to use for connection to RDBMS.

        --rdbms:user &lt;RDBMS user&gt;, -u &lt;RDBMS user&gt;, --user &lt;RDBMS user&gt;
            User for login to RDBMS.

            This option is required if any of the following options are
            specified: --rdbms:url, --url


        --relationship-name &lt;table(default)|column&gt;, --rel-name
        &lt;table(default)|column&gt;
            Specifies whether to get the name for relationships from table names
            or column names.

        --schemas &lt;Schemas&gt;
            Lists all schemas to include by name or pattern.
            Use '-r' &lt;PATTERN&gt; to filter by regex, ex. '-r .*\.north.*',
            '-g' &lt;PATTERN&gt; for grep syntax, ex. '-g .*\.north.*' ,
            or '-l' &lt;LIST&gt; to list all schemas names ex. '-l northwind,exc'

        --tables &lt;Tables&gt;, --tabs &lt;Tables&gt;
            Lists all tables to include/exclude by name or pattern.
            Use '-r' &lt;PATTERN&gt; to filter by regex, ex. '-r .*\.purchase.*' or
            'northwind.purchase.*' ,
            '-g' &lt;PATTERN&gt; for grep syntax, ex. '-g .*\.purchase.*' or
            'northwind.purchase.*' ,
            or '-l' &lt;LIST&gt; to list all tables names ex. '-l
            customers,purchase,orders'

        --tiny-int &lt;byte(default)|boolean&gt;
            Specifies whether to convert TinyInt to byte or boolean

        --types &lt;Types&gt;
            Lists all column types to include/exclude by name separated by
            commas. Valid values:
            unknown,
            binary,
            bit,
            character,
            id,
            integer,
            real,
            reference,
            temporal,
            url,
            xml,
            large_object,
            object;

        --using &lt;import tool&gt;
            Import tool that will be used to load data into neo4j.

        --
            This option can be used to separate command-line options from the
            list of arguments (useful when arguments might be mistaken for
            command-line options)

        &lt;table1 table2 ...&gt;
            Tables to be excluded/included</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_parameters_usage">Parameters Usage</h3>
<div class="listingblock">
<div class="content">
<pre>There are two ways for write Etl parameters:

1) write parameters in command line:

    $NEO4J_HOME/bin/neo4j-etl export|generate-metadata-mapping
      --rdbms:url jdbc:oracle:thin:@localhost:49161:XE
      --rdbms:user northwind --rdbms :password northwind
      --rdbms:schema northwind
      --using bulk:neo4j-import
      --import-tool $NEO4J_HOME/bin
      --csv-directory /tmp/northwind
      --options-file /tmp/northwind/options.json
      --quote '"' --force
      ...

2) use a config file:

    $NEO4J_HOME/bin/neo4j-etl export|generate-metadata-mapping  \
    --config-file &lt;path to .config file&gt;

    Above there is an Example of config file.

#EXAMPLE - ETL CONFIG FILE

#RDBMS
rdbms-url=url
rdbms-schema=schema
rdbms-password=neo4j
rdbms-user=neo4j
rdbms-fetch-size=10000

#NEO4J
using=cypher:direct
neo4j-url=bolt://127.0.0.1:7687
neo4j-user=neo4j
neo4j-password=neo4j

#RULES
exclusion-mode-tables=INCLUDE
tables=-l table1,table2,...
exclusion-mode-columns=INCLUDE
columns=-l column1,column2,...
exclusion-mode-column-types=EXCLUDE
column-types=type1,type2,...

#MISC
output-mapping-file=path_to_output_mapping_file
import-tool=path_to_import_tool
csv-directory=path_to_directory
mapping-file=path_to_file

debug=false</pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_example_session_basic">Example Session: Basic</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_generate_metadata_mapping">Generate Metadata Mapping</h3>
<div class="listingblock">
<div class="content">
<pre>export NEO4J_HOME=/path/to/neo4j-enterprise-3.4.0

mkdir -p /tmp/northwind

$NEO4J_HOME/bin/neo4j-etl generate-metadata-mapping \
  --rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
  --rdbms:user northwind --rdbms:password northwind \
  --rdbms:schema northwind --output-mapping-file /tmp/northwind/mapping.json</pre>
</div>
</div>
<div class="sect3">
<h4 id="_multi_database_support">Multi Database Support</h4>
<div class="paragraph">
<p>Neo4j 4.0 Enterprise has <a href="https://neo4j.com/docs/operations-manual/4.0/manage-databases/">multi-tenancy support</a>,
in order to support this feature we added a select options box in the import view as it follows:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="img/etl.gif" alt="etl">
</div>
</div>
<div class="paragraph">
<p>If you use the command line tool you can specify the destination database by passing
the <code>--neo4j:database-name</code> option in this way:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>echo '{ "multiline-fields" : "true" }' &gt; /tmp/northwind/options.json

$NEO4J_HOME/bin/neo4j-etl export  \
  --rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
  --rdbms:user northwind --rdbms:password northwind \
  --rdbms:schema northwind \
  --using cypher:direct | cypher:batch | cypher:fromSQL \
  --neo4j:url bolt://localhost:7687 \
  --neo4j:user neo4j
  --neo4j:password neo4j \
  --neo4j:database-name myDatabase \
  --import-tool $NEO4J_HOME/bin  \
  --csv-directory /tmp/northwind \
  --options-file /tmp/northwind/options.json \
  --quote '"' --force</pre>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_offline_bulk_import_via_neo4j_import_tool_for_initial_load_neo4j_database_must_be_empty">Offline Bulk Import via <code>neo4j-import</code> tool for initial load (Neo4j database must be empty)</h3>
<div class="paragraph">
<div class="title">N.B</div>
<p>Please consider that since the <code>neo4j-admin import</code> removed the support for json files as source
of the options, we could have problems in case of long command lines derived from db with an high number
of entities involved into the process.</p>
</div>
<div class="listingblock">
<div class="content">
<pre>echo '{ "multiline-fields" : "true" }' &gt; /tmp/northwind/options.json

$NEO4J_HOME/bin/neo4j-etl export  \
  --rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
  --rdbms:user northwind --rdbms :password northwind \
  --rdbms:schema northwind \
  --using bulk:neo4j-import \
  --import-tool $NEO4J_HOME/bin  \
  --csv-directory /tmp/northwind \
  --options-file /tmp/northwind/options.json \
  --quote '"' --force</pre>
</div>
</div>
<div class="listingblock">
<div class="title">Test Offline Bulk Import result</div>
<div class="content">
<pre>$NEO4J_HOME/bin/neo4j-shell -path $NEO4J_HOME/data/databases/graph.db/ -c 'MATCH (n) RETURN labels(n), count(*);'

 +--------------------------+
 | labels(n)     | count(*) |
 +--------------------------+
 | ["Shipper"]   | 3        |
 | ["Employee"]  | 9        |
 | ["Region"]    | 4        |
 | ["Customer"]  | 93       |
 | ["Territory"] | 53       |
 | ["Product"]   | 77       |
 | ["Supplier"]  | 29       |
 | ["Order"]     | 830      |
 | ["Category"]  | 8        |
 +--------------------------+
 9 rows</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_online_batch_import_via_java_bolt_driver_for_incremental_load_neo4j_can_be_already_populated">Online Batch Import via <code>java-bolt-driver</code> for incremental load (neo4j can be already populated)</h3>
<div class="paragraph">
<p>It can be done in 3 modes:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>'cypher:direct' (LOAD CSV)</p>
</li>
<li>
<p>'cypher:batch' (which creates CSV files in the same way as cypher:direct but it
translate them into UNWIND statements instead of LOAD CSV)</p>
</li>
<li>
<p>'cypher:fromSQL' (which translate tabular result data from the RDBMS, without creating CSV files)</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>In online mode via <code>java-bolt-diver</code>, in order to allow importing CSV from temporary folder is necessary:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>enable property <code>dbms.security.allow_csv_import_from_file_urls</code> and set it to true in order to allow
LOAD CSV to read CSV files from external resource</p>
</li>
<li>
<p>remove property <code>dbms.directories.import=import</code> or comment it out to prevent Neo4j to search for CSV file
into the default import folder</p>
</li>
</ul>
</div>
<div class="paragraph">
<p><strong>For Neo4j remote instances you must use <code>cypher:batch</code> import mode</strong></p>
</div>
<div class="listingblock">
<div class="content">
<pre>echo '{ "multiline-fields" : "true" }' &gt; /tmp/northwind/options.json

$NEO4J_HOME/bin/neo4j-etl export  \
  --rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
  --rdbms:user northwind --rdbms:password northwind \
  --rdbms:schema northwind \
  --using cypher:direct | cypher:batch | cypher:fromSQL \
  --neo4j:url bolt://localhost:7687 \
  --neo4j:user neo4j --neo4j:password neo4j \
  --import-tool $NEO4J_HOME/bin  \
  --csv-directory /tmp/northwind \
  --options-file /tmp/northwind/options.json \
  --quote '"' --force

Additional command line options for `cypher:batch` and `cypher:fromSQL` import modes:

 --unwindBatchSize &lt;value&gt; (Batch size that will be used for unwind data) \
 --txBatchSize &lt;value&gt; (Transaction Batch size that will be used for unwind commit) \</pre>
</div>
</div>
<div class="listingblock">
<div class="title">Test Online Batch Incremental Import result</div>
<div class="content">
<pre>$NEO4J_HOME/bin/cypher-shell -a bolt://localhost:7687 -u neo4j -p neo4j 'MATCH (n) RETURN labels(n), count(*);'

 +--------------------------+
 | labels(n)     | count(*) |
 +--------------------------+
 | ["Shipper"]   | 3        |
 | ["Employee"]  | 9        |
 | ["Region"]    | 4        |
 | ["Customer"]  | 93       |
 | ["Territory"] | 53       |
 | ["Product"]   | 77       |
 | ["Supplier"]  | 29       |
 | ["Order"]     | 830      |
 | ["Category"]  | 8        |
 +--------------------------+
 9 rows</pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_example_session_docker_northwind">Example Session: Docker + Northwind</h2>
<div class="sectionbody">
<div class="paragraph">
<p>This example session is based on the Northwind example dataset.</p>
</div>
<div class="paragraph">
<p>DDL scripts are available here:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><a href="https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/mysql/northwind.sql">MySQL</a></p>
</li>
<li>
<p><a href="https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/postgresql/northwind.sql">PostgreSQL</a></p>
</li>
<li>
<p><a href="https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/oracle/northwind.sql">Oracle</a></p>
</li>
<li>
<p><a href="https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/mssql/northwind.sql">Microsoft SQL</a></p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="_mysql">MySQL</h3>
<div class="paragraph">
<p>Download, start and configure the docker container with MySQL:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker pull mysql

docker run --name neo4j-etl-mysql -e MYSQL_ROOT_PASSWORD=admin -e MYSQL_DATABASE=northwind -e MYSQL_USER=neo4j -e MYSQL_PASSWORD=neo4j -d -p 3306:3306 mysql:latest

docker exec -it neo4j-etl-mysql bash
root@eb6f279fdb88:/# mysql -u root -p
Enter password: admin
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.18 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt; grant all privileges on *.* to 'neo4j'@'%' with grant option;
Query OK, 0 rows affected (0.00 sec)

mysql&gt; quit;
Bye
root@bf99fbc0d31c:/# exit
exit</pre>
</div>
</div>
<div class="paragraph">
<p>Load the database via the following sql script:
<a href="https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/mysql/northwind.sql" class="bare">https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/mysql/northwind.sql</a></p>
</div>
<div class="listingblock">
<div class="content">
<pre>export NEO4J_HOME=/path/to/neo4j-enterprise-3.4.0

mkdir -p /tmp/northwind

echo '{ "multiline-fields" : "true" }' &gt; /tmp/northwind/options.json

./bin/neo4j-etl export \
  --rdbms:url jdbc:mysql://localhost:5433/northwind?autoReconnect=true&amp;useSSL=false \
  --rdbms:user neo4j --rdbms:password neo4j \
  --import-tool $NEO4J_HOME/bin \
  --options-file /tmp/northwind/options.json \
  --csv-directory /tmp/northwind \
  --destination $NEO4J_HOME/data/databases/graph.db/ \
  --quote '"' --force</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_postgresql">PostgreSQL</h3>
<div class="paragraph">
<p>Download, start and configure the docker container with PostgreSQL 9.6.2:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker pull postgres

docker run --name neo4j-etl-postgres -e POSTGRES_USER=neo4j -e POSTGRES_PASSWORD=neo4j -d -p 5433:5432 postgres

docker run -it --rm --link neo4j-etl-postgres:postgres postgres psql -h postgres -U neo4j
Password for user neo4j:
psql (9.6.2)
Type "help" for help.

neo4j=# DROP DATABASE IF EXISTS northwind;
neo4j=# CREATE DATABASE northwind WITH OWNER 'neo4j' ENCODING 'UTF8' LC_COLLATE = 'en_US.utf8' LC_CTYPE = 'en_US.utf8';
neo4j=# \q</pre>
</div>
</div>
<div class="paragraph">
<p>Load the database via the following sql script:
<a href="https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/postgresql/northwind.sql">northwind.sql</a></p>
</div>
<div class="listingblock">
<div class="content">
<pre>export NEO4J_HOME=/path/to/neo4j-enterprise-3.4.0

mkdir -p /tmp/northwind

echo '{"multiline-fields":"true"}' &gt; /tmp/northwind/options.json

./bin/neo4j-etl export \
  --rdbms:url jdbc:postgresql://localhost:5433/northwind?ssl=false \
  --rdbms:user neo4j --rdbms:password neo4j \
  --import-tool $NEO4J_HOME/bin \
  --options-file /tmp/northwind/options.json \
  --csv-directory /tmp/northwind \
  --destination $NEO4J_HOME/data/databases/graph.db/ \
  --quote '"' --force</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_oracle">Oracle</h3>
<div class="paragraph">
<p>Download, start and configure the docker container with Oracle XE 11g:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker pull wnameless/oracle-xe-11g

docker run --name neo4j-etl-oracle -d -p 49160:22 -p 49161:1521 wnameless/oracle-xe-11g

ssh root@localhost -p 49160
root@localhost's password: admin

Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.9.13-moby x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Mon May  1 17:32:48 2017 from 172.17.0.1

root@692c446a274b:~# wget https://raw.githubusercontent.com/neo4j-contrib/neo4j-etl/master/neo4j-etl-it/src/main/resources/scripts/oracle/northwind.sql

root@692c446a274b:~# sqlplus system/oracle

SQL&gt; CREATE USER northwind IDENTIFIED BY northwind;
SQL&gt; GRANT DBA TO northwind;
SQL&gt; CONN northwind/northwind;
SQL&gt; SET sqlblanklines ON;
SQL&gt; @northwind.sql
SQL&gt; quit;

root@692c446a274b:~# exit

export NEO4J_HOME=/path/to/neo4j-enterprise-3.4.0

mkdir -p /tmp/northwind

echo '{"multiline-fields":"true"}' &gt; /tmp/northwind/options.json

./bin/neo4j-etl export \
  --rdbms:url jdbc:oracle:thin:@localhost:49161:XE \
  --rdbms:user northwind --rdbms:password northwind \
  --rdbms:schema northwind \
  --import-tool $NEO4J_HOME/bin \
  --options-file /tmp/northwind/options.json \
  --csv-directory /tmp/northwind \
  --destination $NEO4J_HOME/data/databases/graph.db/ \
  --quote '"' --force
  --driver /tmp/ojdbc6-11.2.0.3.jar</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_microsoft_sql">Microsoft SQL</h3>
<div class="paragraph">
<p>Download, start and configure the docker container with Microsoft SQL Server:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker run --name neo4j-etl-mssql -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Passw0rd!' -p 1433:1433 -d microsoft/mssql-server-linux</pre>
</div>
</div>
<div class="paragraph">
<p>If you want to connect to Microsoft SQL client console then you can run the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>docker exec -it neo4j-etl-mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'Passw0rd!' -d &lt;DATABASE&gt;</pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre>export NEO4J_HOME=/path/to/neo4j-enterprise-3.4.0

mkdir -p /tmp/wideworldimporters

echo '{"multiline-fields":"true"}' &gt; /tmp/wideworldimporters/options.json

./bin/neo4j-etl export \
    --rdbms:password "Passw0rd!" \
    --rdbms:user sa \
    --rdbms:url "jdbc:sqlserver://localhost:1433;databaseName=WideWorldImporters" \
    --import-tool $NEO4J_HOME/bin \
    --options-file /tmp/wideworldimporters/options.json \
    --csv-directory /tmp/wideworldimporters \
    --destination $NEO4J_HOME/data/databases/graph.db/ \
    --driver /tmp/mssql-jdbc-6.1.0.jre8.jar \</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_how_to_import_world_wide_importers_database_into_a_ms_sql_server_docker_instance">How to import World Wide Importers database into a MS SQL server Docker instance</h3>
<div class="listingblock">
<div class="content">
<pre># Create docker instance for MS-SQL Server
docker run --name mssql-etl \
-e MSSQL_COLLATION=Latin1_General_100_CI_AS \
-e 'ACCEPT_EULA=Y' \
-e 'SA_PASSWORD=&lt;YOUR_PASSWORD&gt;' \
-p 1433:1433 \
-v /tmp:/tmp \
-d microsoft/mssql-server-linux:2017-latest

# Download World Wide Importers backup file
wget https://github.com/Microsoft/sql-server-samples/releases/download/wide-world-importers-v1.0/WideWorldImporters-Full.bak

# Create a backup directory
sudo docker exec -it mssql-etl mkdir /var/opt/mssql/backup

# Load backup file into the container
sudo docker cp WideWorldImporters-Full.bak mssql-etl:/var/opt/mssql/backup

# Restore Wide World Importers database
sudo docker exec -it mssql-etl /opt/mssql-tools/bin/sqlcmd \
-S localhost \
-U SA \
-P '&lt;YOUR_PASSWORD&gt;' \
-Q 'RESTORE FILELISTONLY FROM DISK = "/var/opt/mssql/backup/WideWorldImporters-Full.bak"' \
| tr -s ' ' \
| cut -d ' ' -f 1-2

sudo docker exec -it mssql-etl /opt/mssql-tools/bin/sqlcmd \
-S localhost \
-U SA \
-P '&lt;YOUR_PASSWORD&gt;' \
-Q 'RESTORE DATABASE WideWorldImporters FROM DISK = "/var/opt/mssql/backup/WideWorldImporters-Full.bak" WITH MOVE "WWI_Primary" TO "/var/opt/mssql/data/WideWorldImporters.mdf", MOVE "WWI_UserData" TO "/var/opt/mssql/data/WideWorldImporters_userdata.ndf", MOVE "WWI_Log" TO "/var/opt/mssql/data/WideWorldImporters.ldf", MOVE "WWI_InMemory_Data_1" TO "/var/opt/mssql/data/WideWorldImporters_InMemory_Data_1"'</pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_capabilities">Capabilities</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="_inferring_schema_with_mapping_rules_generate_metadata_mapping">Inferring Schema with Mapping Rules (generate-metadata-mapping)</h3>
<div class="ulist">
<ul>
<li>
<p>Generic relational database mapping based on the following rules</p>
</li>
<li>
<p>A <em>table</em> with a foreign key is treated as a <em>Join</em> and imported as a <em>node</em> with a <em>relationship</em></p>
</li>
<li>
<p>Ex: <code>Person -&gt; Address</code> is imported as <code>(Person)-[:ADDRESS_ID]-&gt;(Address)</code></p>
</li>
<li>
<p>A <em>table</em> that has two foreign keys is imported as a <em>JoinTable</em> and imported as a <em>relationship</em></p>
</li>
<li>
<p>Ex: <code>Student &lt;- Student_Course -&gt; Course</code> is imported as <br>
<code>(Student) -[:STUDENT_COURSE]-&gt; (Course)</code></p>
</li>
<li>
<p>A <em>table</em> that has more than two foreign keys is treated as an <em>intermediate node</em> and imported as <em>node with multiple relationships</em></p>
</li>
<li>
<p>Ex: <code>Order_Detail -&gt; Shipping_Address, Order_Detail -&gt; Payment_Information, Order_Detail -&gt; Shipment_Instructions</code> is imported as</p>
</li>
</ul>
</div>
<div class="listingblock">
<div class="content">
<pre>(Shipping_Address) -[:SHIPPING]-&gt; (Order_Detail)
(Payment_Information) -[:PAYMENT]-&gt; (Order_Detail)
(Shipment_Instructions) -[:SHIPMENT]-&gt; (Order_Detail)</pre>
</div>
</div>
<div class="ulist">
<ul>
<li>
<p>Resolve relationships through composite keys.</p>
</li>
<li>
<p>Support most of the data types.</p>
<div class="ulist">
<ul>
<li>
<p><em>TinyInt</em> can be imported as either <em>Byte</em> or as a <em>Boolean</em> <em>(This is to support boolean values being saved in mysql as TinyInt)</em></p>
</li>
<li>
<p><em>Dates</em> are imported as <em>String</em></p>
</li>
<li>
<p><em>Blobs</em> are skipped while importing until the import-tool supports binary array data.</p>
</li>
<li>
<p><em>Decimal to be confirmed.</em></p>
</li>
</ul>
</div>
</li>
<li>
<p>Relationship names can either take <em>column name</em> or the <em>table that is being referred to</em></p>
<div class="ulist">
<ul>
<li>
<p><code>--relationship-name=table</code> then a <code>Person-&gt;Address</code> will become <code>(Person)-[:ADDRESS]-&gt;(Address)</code></p>
</li>
<li>
<p><code>--relationship-name=column</code> will become <code>(Person)-[:ADDRESS_ID]-&gt;(Address)</code></p>
</li>
</ul>
</div>
</li>
<li>
<p>Filter tables that you want to include or exclude using <code>--include</code> and <code>--exclude</code></p>
</li>
<li>
<p>TODO: Filter columns that you want to include or exclude using <code>--include</code> and <code>--exclude</code></p>
</li>
<li>
<p>TODO: Retaining natural keys(marked as PrimaryKeys and ForeignKeys) as needed using &lt;TBA&gt; flag</p>
<div class="ulist">
<ul>
<li>
<p>A Foreign Key is usually used to create a relationship between 2 nodes without being saved as a property.</p>
</li>
<li>
<p>With this flag, the node would keep that value as a property.</p>
</li>
<li>
<p>Ex: A loan has the SSN of the loan applicant which would normally be used to connect the <code>Loan</code> and <code>Person</code> nodes.</p>
</li>
<li>
<p>With this flag the <code>Loan</code> node will also keep the <code>SSN</code> as a property.</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
<div class="sect2">
<h3 id="_edit_mapping_via_ui">Edit Mapping via UI</h3>
<div class="paragraph">
<p>A Neo4j-ETL graph application can be added Neo4j Desktop which allows visual editing of the mapping and interactive import.</p>
</div>
<div class="paragraph">
<p>The UI allows you to change and set you preferred <strong>label</strong> names, <strong>property</strong> names and types, <strong>relationship</strong> types, with a preview of the resulting graph.</p>
</div>
</div>
<div class="sect2">
<h3 id="_exporting_data_export">Exporting Data (export)</h3>
<div class="ulist">
<ul>
<li>
<p>Generate CSV files from relational source as outlined by <code>mappings.json</code></p>
<div class="ulist">
<ul>
<li>
<p>TODO: Use a streaming api that is more performant</p>
</li>
</ul>
</div>
</li>
<li>
<p>Import CSV providing the correct labels and rel-types and headers headers</p>
<div class="ulist">
<ul>
<li>
<p>TODO: Missing ability to pass options to <code>neo4j-import</code> tool as a file instead of command line arguments</p>
</li>
<li>
<p>TODO: Create indexes and constraints related to not-primary key columns</p>
</li>
</ul>
</div>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2020-03-16 18:51:34 +0100
</div>
</div>
</body>
</html>